<?

/**
 * Helpers class
 *
*/
class Helpers extends Core {

	function __construct () {
		parent::__construct();
	}

	/**
	 * Parte la URL en valores Magnet
	 * 
	 * @param string $get
	 * @return array $routes
	 */
	public function route ($get, $routes = null) {
		foreach ($routes as $route) {
			if ($get === $route["url"]) {
				call_user_func($route["function"]);
				exit;
			}
		}
		$pattern = '/(\w+)?\\/?(\w+)?\\/?(\w+)?\\/?(.*)?/';
		preg_match($pattern, $get, $matches);
		array_shift($matches);
		$pieces = array("route", "section", "action", "params");
		for ($i = 0, $end = count($pieces); $i < $end; $i++) {
			if ($matches[$i])
				$rec[$pieces[$i]] = $matches[$i];
		}
		if ($rec["params"])
			$rec["params"] = ($this instanceof self)? $this->getparams($rec["params"]) : self::getparams($rec["params"]);
		return $rec;
	}
	
	/**
	 * Crea un array a partir de parametros separados por dos puntos
	 * 
	 * @param string $params_string
	 * @return array $params
	 */
	public function getparams ($params_string) {
		// Create params array
		$params_tmp = explode("/", $params_string);
		$protected = array('page', 'limit');
		foreach ($params_tmp as $param) {
			list($column, $value) = explode(":", $param);
			if (!empty($value)) {
				if ($column == 'id') {
					// Get the IDs
					$id = explode(",", $value);
					$params['id'] = $id;
					$detail = true;
				} else if ($column == 'order') {
					// Get the order
					$aux = explode("|", $value);
					$params['order'] = array($aux[0], ($aux[1]) ? $aux[1] : 'asc');
				} else if (in_array($column, $protected)) {
					// Get the protected params like page and limit
					$params[$column] = $value;
				} else {
					// Get the filters for SQL query and clean URL without that filter
					$params['filters'][$column]['column'] = $column;
					$params['filters'][$column]['value'] = $value;
					$params['filters'][$column]['operator'] = "LIKE";
					$params['filters'][$column]['clean'] = preg_replace('/' . $column . ':([^\\/]+)\\/?/', '', $params_string);
				}
			}
		}
		// Create the URL without page or limit for future paging
		if (!$detail) {
			$params['url']['back'] = $params_string;
			$params['url']['without_paging'] = preg_replace('/(' . join($protected, '|') . '):([^\\/]+)\\/?/', '', $params_string);
			$params['url']['without_order'] = preg_replace('/order:([^\\/]+)\\/?/', '', $params_string);
		}
		return $params;
	}
	
	/**
	 * Crea un paginador
	 * 
	 * @param
	 * @return
	 */
	public function paginate ($url, $limit, $results, $page) {
	
		// Page
		$page = (!empty($page)) ? $page : 1;
		$limit = (!empty($limit)) ? $limit : 20;

		// Ultima pagina
		$ultima = ($limit == 0) ? 0 : ceil($results / $limit);

		// Cantidad de botones a cada lado
		$botones = 5;

		// Defino el centro
		$centro = $page;

		// El ultimo registro de la pagina
		$final = $limit * $page;

		// El primer registro de la pagina
		$inicial = $final - $limit + 1;

		// Oops! Menos resultados que items por pagina o estamos en la ultima pagina
		if (($results < $limit) || ($page == $ultima))
			$final = $results;
			
		// Si estamos sobre el inicio, el centro cambia
		if ($page < $botones) {
			$centro = $botones + 1;
		}
		
		// Si estamos sobre el final, el centro cambia
		else if (($centro + $botones) > $ultima) {
			$centro = $ultima - $botones;
		}

		// Inicio
		$inicio = $centro - $botones;
		if ($page == $botones) {
			$inicio = $inicio + 1;
		}

		// Fin
		$fin = $ultima;
		if ($ultima > ($botones * 2)) {
			$fin = $centro + $botones;
		}

		// Primer boton: Inicio
		if ($page != 1)
			$pagedor[] = array('text' => 'First', 'number' => 1);
			
		// Segundo boton: Anterior
		if ($page != 1)
			$pagedor[] = array('text' => '&laquo; Previous', 'number' => $page - 1);

		// Creamos los botones numerados
		for ($i = $inicio; $i <= $fin; $i++) {
			$pagedor[] = array('text' => $i, 'number' => $i);
		}

		// Anteultimo boton: Siguiente
		if ($page != $ultima)
			$pagedor[] = array('text' => 'Next &raquo;', 'number' => $page + 1);

		// Ultimo boton: Fin
		if ($page != $ultima)
			$pagedor[] = array('text' => 'Last', 'number' => $ultima);
			
		// Agregamos las URL
		foreach($pagedor as $key_pagina => $value_pagina) {
			$pagedor[$key_pagina]['url'] = $url;
			if ($limit != CONFIG_LIST_LIMIT)
				$pagedor[$key_pagina]['url'] .= 'limit:' . $limit . '/';
			$pagedor[$key_pagina]['url'] .=	'page:' . $pagedor[$key_pagina]['number'] . '/';
		}

		// Retornamos el array paginador
		return array('from' => $inicial, 'to' => $final, 'buttons' => $pagedor);
	
	}
	
	/**
	 * Report an error by default template and ends execution
	 * 
	 * @param
	 * @return
	 */
	public function end($message, $theme = CONFIG_THEME) {
		include('themes/' . $theme . '/error.tpl');
		exit;
	}
	
	
	
}

?>
